using System;
using System.Collections.Generic;
using System.Text;

namespace EuropeEngulfed.NET
{
    interface IPlayer
    {
        bool DisplayWeatherDetermination(GameController.playerType player, GameState.Weather southernWeather, GameState.Weather westernWeather, GameState.Weather easternWeather, MapInfo.gameDateWeatherType weatherType, uint axisDieRoll, uint alliedDieRoll);
        void DisplayCalculatingSupply(GameController.playerType player);

        List<StratWarfareMove> DoStrategicBombingWarfare(GameController.playerType player,
        uint originalWesternAlliedBombers, uint originalWesternAlliedFighters, uint WesternAlliedFlak, uint originalGermanBombers,
        uint originalGermanFighters, uint GermanFlak, uint targetedWERPProduction, GameState.Weather currentWesternWeather,
        GameTurn.GameDate currentGameDate, GameTurn.GamePhase currentGamePhase,
        bool upgradedEscorts, bool upgradeBombers);

        bool ReportStrategicBombingWarfare(GameController.playerType player,
        uint originalWesternAlliedBombers, uint originalWesternAlliedFighters, uint WesternAlliedFlak, uint originalGermanBombers,
        uint originalGermanFighters, uint GermanFlak, uint targetedWERPProduction, GameState.Weather currentWesternWeather,
        GameTurn.GameDate currentGameDate, GameTurn.GamePhase currentGamePhase,
        bool upgradedEscorts, bool upgradeBombers,
        bool operationOverlord, int numEscortsShotDown, int numInterceptorsShotDownByEscorts, int numInterceptorsShotDownByBombers, int numBombersShotDownByInterceptors, int numBombersShotDownByFlak, int numStrategicBombHits);

        StratWarfareMove DoStrategicUBoatWarfare(int numGermanUBoats, int numBritishASWLevel, int UKWERPProduction);
        bool ReportStrategicUBoatWarfare(int numGermanUBoats, int numBritishASWLevel, int UKWERPProduction, int numASWHits, int numWERPHits);
        List<StratWarfareMove> DoStrategicVWeaponWarfare(int numV1s, int numV2s, int numFigthers, int flakLevel, int WERPs);
        bool ReportStrategicVWeaponWarfare(int numV1s, int numV2s, int numFigthers, int flakLevel, int WERPs,
                                                  int numV1sLaunched, int numV2sLaunched, int NumV1sShotDownByFighters, int NumV1sShotDownByFlak, int numWERPsShotDownByV1s, int numWERPsShotDownByV2s);
        List<ProductionMove> DoAxisProductionPhase(Dictionary<MapInfo.CountryID, List<Region>> countryValidSupplySources, int germanInitialWERPS, int ItalianInitialWERPS, int strategicWarfareLosses, int germanFleetMaintenance, int italianFleetMaintenance, int startingGermanSpecialActions, int maxGermanSpecialActions, int startingItalianSpecialActions,int maxItalianSpecialActions, bool germanFleetBuildAvailable, bool italianFleetBuildAvailable, bool FlakBuildable, bool V1BuildAvailable, bool V2BuildAvailable, bool PloestiRestrictionsInEffect, List<GameState.ForcePoolAdjustment> listOfForcePoolAdjustments);
        List<ProductionMove> DoAlliedProductionPhase(Dictionary<MapInfo.CountryID, List<Region>> countryValidSupplySources, int UKInitialWERPS, int frenchInitialWERPS, int USSRInitialWERPS, int USAInitialWERPS, int strategicWarfareLosses, int UKFleetMaintenance, int frenchFleetMaintenance, int USSRFleetMaintenance, int startingUKSpecialActions, int startingFrenchSpecialActions, int startingUSSRSpecialActions, int maxUSSRSpecialActions, int startingUSASpecialActions, int maxUSASpecialActions, bool UKFleetBuildAvailable, bool frenchFleetBuildAvailable, bool USAFleetBuildAvailable, bool USSRFleetBuildAvailable, bool FlakBuildable, bool ASWBuildAvailable, bool USAtWar, bool USSRAtWar, int lendLeaseFromUSAForUK, int lendLeaseFromUSAForUSSR, int maxBritishWERPsToUSSR, bool britishLendLeaseToUSSRHalved, int russianEmergencyConscriptionSteps, bool russianCadreBonusInEffect, bool russianProductionPenalty, bool britishProductionPenalty, bool russianEliteInfantryReinforcements, List<GameState.ForcePoolAdjustment> listOfForcePoolAdjustments, GameController.UKLendLease ukLendLease);
        bool AskForStrategicWarfareInterception(GameController.playerType player);
        List<SupplySelectionMove> DoSupplySelection(GameController.playerType player, bool finalSupply, Dictionary<MapInfo.RegionID, Dictionary<MapInfo.CountryID, List<GameController.SeaSupplySolution>>> regionsCountryOOSorUSingSeaToReturn, Dictionary<MapInfo.RegionID, int> seaSupplyPoints);
        List<OperationalMove> DoInitialOps(GameController.playerType player);
        List<OperationalMove> DoBreakThroughOps(GameController.playerType player, List<MapInfo.CountryID> countriesSpendingSA);
        List<StrategicMove> DoInitialStrategicMovement(GameController.playerType player);
        List<DeploymentMove> DoNewCountryDeployment(GameController.playerType player, MapInfo.CountryID country);
        bool AskForNavalInterception(GameController.playerType player, SeaMoveOperationalMove seaMove);
        bool ReportNavalInterception(GameController.playerType player, MapInfo.RegionID regionID, int numFriendlyHitsOn6, int numFriendlyHitsOn56, int numEnemyHitsOn6, int numEnemyHitsOn56, List<PlayingPiece> piecesTransported, List<PlayingPiece> piecesLost);
        CombatMove DoBreakThroughCombat(GameController.playerType player, List<MapInfo.CountryID> countriesSpendingSA, bool followingFromBreakThroughOps, MapInfo.RegionID breakThroughOpsRegion);
        List<CombatMove> DoInitialCombatPhase(GameController.playerType player);
        GameController.defenderOptions AskDefenderForDefenderOptions(GameController.playerType defendingPlayer, MapInfo.RegionID regionID, bool selectGSUs, bool breakThroughCombat, bool assault, List<MapInfo.CountryID> countriesSpendingSA, List<CombatMove> combatMovesAlreadyTaken);
        Dictionary<MapInfo.CountryID, int> AskForGSUCombatCasualties(GameController.playerType playerAssigningCasualties, GameController.playerType defendingPlayer, MapInfo.RegionID regionID, Dictionary<MapInfo.CountryID, int> defendingGSUSelections, Dictionary<MapInfo.CountryID, int> attackingGSUSelections, List<int> defendingDieRolls, List<int> attackingDieRolls, bool breakThrough, List<MapInfo.CountryID> countriesSpendingSA);
        Dictionary<PlayingPiece, int> DoDefenderCombat(GameController.playerType defendingPlayer, MapInfo.RegionID regionID, bool assault, Dictionary<MapInfo.CountryID, int> defendingGSUSelections, Dictionary<MapInfo.CountryID, int> attackingGSUSelections, bool counterAttack, List<MapInfo.CountryID> countriesSpendingSAForBreakThroughCombat, List<CombatMove> combatMovesAlreadyTaken);
        Dictionary<PlayingPiece, int> AskAttackerToAssignLosses(GameController.playerType attackingPlayer, MapInfo.RegionID regionID, bool assault, Dictionary<MapInfo.CountryID, int> defendingGSUSelections, Dictionary<MapInfo.CountryID, int> attackingGSUSelections, int numInfantryLosses, int numArmorLosses, bool counterAttack, List<MapInfo.CountryID> countriesSpendingSAInBattle, List<CombatMove> combatMovesAlreadyTaken);
        Dictionary<PlayingPiece, int> AskDefenderToAssignLosses(GameController.playerType defendingPlayer, MapInfo.RegionID battleRegionID, bool assault, Dictionary<MapInfo.CountryID, int> defendingGSUSelections, Dictionary<MapInfo.CountryID, int> attackingGSUSelections, int numInfantryLosses, int numArmorLosses, bool counterAttack, List<CombatMove> combatMovesAlreadyTaken);
        List<OperationalMove> AskDefenderForRetreatBeforeCombatMoves(GameController.playerType defendingPlayer, MapInfo.RegionID regionID, List<CombatMove> combatMovesAlreadyTaken);
        GameController.defenderCounterAttackOptions AskDefenderForCounterAttack(GameController.playerType defendingPlayer, MapInfo.RegionID battleRegion, List<CombatMove> combatMovesAlreadyTaken);
        GameController.breakThroughSelection AskForBreakThroughOption(GameController.playerType player, bool canBreakthroughCombat);
        List<StrategicMove> DoBreakThroughStrategicMovement(GameController.playerType player);
        void InformPlayerOfConquest(GameController.playerType player, MapInfo.CountryID country);
        List<FleetTransferMove> DoFleetPointTransfers(GameController.playerType player);
        List<MovePieceOperationalMove> DoFortressOverStackMoves(GameController.playerType player, MapInfo.RegionID regionID, int numBlocksToMove);
        bool AskAxisPlayerForVichy();
        void InformPlayer(GameController.playerType player, string information);
        List<SovietUpFrontDefenseRedeploymentMove> DoAxisRedeploymentOfSovietUpFrontDefenses();
        void InformPlayerOfVictory(GameController.playerType player, GameController.Victory victory);
        bool InformPlayerOfChangeOfPhase(GameController.playerType player, GameTurn.GameDate gameDate, GameTurn.GameSubPhase gameSubPhase, GameState gameStateToUpdate);
    }
}
